package com.dy.design_pattern_study.memento_pattern.dome3;


/**
 * @CreateBy zhangdingyi
 * @Date 2023-04-11
 * @Content
 * 备忘录（Memento）：在不破坏封装性的前提下，捕获一个对象的内部状态，并在该对象之外保存这个状态。
 * 这样以后就可将该对象恢复到原先保存的状态。
 *
 * 从实际的代码上面看，这个东西，比想象中有点，消耗内存了，这里需要用一个实体类来存储对应的字段，也就是说
 * 在实际的开发环境中，是不可能直接使用备忘录模式的，应该是跟着MongoDB、redis这些一起使用
 * 否则把过多的数据保存在电脑的缓存中，还是比较耗费性能的。
 * 是否可以用clone模式来对游戏角色来进行数据的备份？
 * 如果在某个仅有状态的类的话是可以考虑的，但是如果包含着自己不需要的状态的话，这个就是不必要的
 *
 * 要保存的细节给封装在了Memento中了，哪一天要更改保存的细节也不用影响客户端了
 * 使用备忘录可以把复杂的对象内部信息对其他的对象屏蔽起来
 *
 * 备忘录模式在什么时候用？
 * 1.Memento模式比较适用于功能比较复杂的，但需要维护或记录属性历史的类，
 * 或者需要保存的属性只是众多属性中的一小部分时，Originator可以根据保存的Memento信息还原到前一状态。
 *
 */
public class client {

    public static void main(String[] args) {

        //boss战前 -获得初始化角色状态
        GameRole lixiaoyao = new GameRole();
        lixiaoyao.getInitState();
        lixiaoyao.stateDisplay();

        //保存进度 -创建管理员来保存角色状态 --备份模式主要是这里备份数据
        GameCareTaker caretaker = new GameCareTaker();
        caretaker.setGameMemento(lixiaoyao.saveState());

        //boss战中 -消耗状态
        lixiaoyao.fight();
        lixiaoyao.stateDisplay();

        //结束boss战，状态恢复 -把原先备份的状态还原 --还有这里还原数据
        lixiaoyao.recoveryState(caretaker.getGameMemento());

        lixiaoyao.stateDisplay();
    }
}
